#include "CargadorMasivo.h"

#include <fstream>
#include <string>
#include <memory>
#include <string.h>

#include "../arbol-ub/registroub.h"
#include "mapeador.h"

CargadorMasivo* CargadorMasivo::cargadorMasivo = NULL;

CargadorMasivo* CargadorMasivo::getInstance(){
	if (!cargadorMasivo){
		cargadorMasivo = new CargadorMasivo();
	}
	return cargadorMasivo;
}

CargadorMasivo::CargadorMasivo(){
}

CargadorMasivo::~CargadorMasivo(){
}


void CargadorMasivo::cargarClaves(ArbolUB<DIMENSION_CLAVES, CANTIDAD_BITS_CLAVES>& arbol, std::string archivo_claves){
	std::ifstream arch;
	unsigned int anio;
	unsigned char mes, dia;
	std::string rango;
	Mapeador* mapeador = Mapeador::getInstance();
	std::string dirInput = getenv("INPUT_DIR");
	std::string archClaves = dirInput.append("/").append(archivo_claves);

	arch.open(archClaves);
	std::string linea , clave;
	int i , posicionSeparadorAnt = 0 , posicionSeparadorPost = 0;
	char* buffer = new char[TAM_LECTURA];
	if (!arch.good()){
		std::cout << "No se pudo abrir archivo " << archClaves << std::endl;
		return;
	}
	dirInput = getenv("INPUT_DIR");
	std::string archivoSalida = dirInput.append("/").append(PATH_ALTAS_CLAVES);
	std::ofstream archSalida;
	archSalida.open(archivoSalida);
	if (!archSalida.good()){
		std::cout << "No se pudo abrir archivo " << archivoSalida << std::endl;
		return;
	}

	memset (buffer, '\0', TAM_LECTURA); // limpio buffer
	arch.getline(buffer, TAM_LECTURA); // leo una linea

	do{
		linea = buffer;
		i = posicionSeparadorAnt =  posicionSeparadorPost = 0;
		Point<DIMENSION_CLAVES> point;
		memset (&point, '\0', DIMENSION_CLAVES ); // limpio buffer
		while ( i < DIMENSION_CLAVES ){

			posicionSeparadorPost = linea.find(CARACTER_SEPARADOR , posicionSeparadorAnt);
			clave = linea.substr(posicionSeparadorAnt, posicionSeparadorPost - posicionSeparadorAnt);
			posicionSeparadorAnt   = posicionSeparadorPost + 1;

			if ( i == 1){ // si viene el rango
				if (!clave.empty()){
					mapeador->mapearFechaLeida(clave, &anio, &mes, &dia, &rango);
					point[i] = mapeador->convertirRango(anio, mes, dia, rango);
				}
				else
					point[i] = ID_CLAVE_VACIA;
			}
			else if( i == 4){
				point[i] =
					point[i] = (u_int32_t)atoi(clave.c_str());
			}
			else{
		      point[i] = mapeador->mapStringToId(clave);
			}
			clave.clear();
			++i;
		}
		linea.clear();


		archSalida <<  "Clave a insertada: " << std::endl;
		for (int i= 0; i < DIMENSION_CLAVES; ++i){
			archSalida << (u_int32_t)point[i] << " ";
		}
		archSalida << std::endl;
		RegistroUB<DIMENSION_CLAVES, CANTIDAD_BITS_CLAVES> reg (point);
        arbol.insertar(reg);
		memset (buffer, '\0', TAM_LECTURA); // limpio buffer
		arch.getline(buffer, TAM_LECTURA); // leo una linea

	}while ( !arch.eof());

	if (buffer)
		delete[] buffer;

	arch.close();
	archSalida.close();
	std::cout <<  "Termino Carga Inicial " << std::endl;

}

